<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        //攀爬原型链
        // function Person( name)
        // {
        //     this.name = name;
        // }
        // var obj1 = new Person("刘备");
        // var obj2 = new Person("张飞");


        //实现继承
        //方式一：借用构造函数（经典继承）
        // function Person(name)
        // {
        //     this.name=name;
        // }
        // function Worker(name,salary)
        // {
        //     Person.call(this,name);
        //     this.salary=salary;
        // }
        // var obj3=new Worker("赵云",100);

        //方式二：组合继承（伪经典继承）
        //利用原型链实现对原型对象属性和方法的继承
        //借用构造函数实现实例对象属性和方法的继承
        // function Person(name)
        // {
        //     this.name=name;
        // }
        // Person.prototype.run=function()
        // {
        //     console.log("跑");
        // }       
        // function Worker(name,salary)
        // {
        //     Person.call(this,name);
        //     this.salary=salary;
        // }
        // Worker.prototype=new Person();
        // var obj4=new Worker("赵云",100);
        // console.log(obj4)

        //方式三：原型式继承
        //使用Object.create(),获得某对象的原型
        // var person1 = 
        // {
        //     name : "刘备",
        //     sex : "男",
        //     run:function()
        //     {
        //         console.log("跑");
        //     }
        // }

        // var person2 = Object.create(person1);
        // console.log(person2);

        //方式四：寄生式继承
        //利用一个工厂函数改造一个对象的属性和方法，从而获得新对象
        // function createNewPerson(person)
        // {
        //     var temp=new Object(person);
        //     temp.age=10;
        //     temp.jump=function()
        //     {
        //         console.log("跳");
        //     }
        //     return temp;
        // }
        // var person1=
        // {
        //     name:"刘备",
        //     sex:"男",
        //     run:function()
        //     {
        //         console.log("跑");
        //     }
        // }
        // var person2=createNewPerson(person1);
        // console.log(person1);
        // console.log(person2);
        // console.log(person1==person2);
        // console.log(person1===person2);
        // person2.jump();

        //方式五：寄生组合式继承
        function inheritPrototype(sFun,pFun)
        {
            var myPrototype = new Object(pFun.prototype);
            myPrototype.constructor = sFun;
            sFun.prototype = myPrototype;
        }
        function Person(name)
        {
            this.name = name;
        }
        Person.prototype.run = function()
        {
            console.log("跑");
        }
        function Worker(name,salary)
        {
            Person.call(this , name);
            this.salary = salary;
        }
        inheritPrototype(Worker,Person);
        var worker1 = new Worker("赵云" , 100) ;
        console.log(worker1);

        //多态
        // var makeSound = function(animal) {
        //     animal. sound();
        // }
        // function Duck(){};
        // Duck . prototype。sound = function() {
        //     console.log('嘎嘎嘎');
        // }
        // function Chicken(){};
        // Chicken. prototype . sound = function() {
        //     console.log('咯咯咯');
        // }
        // makeSound(new Chicken());
        // makeSound(new Duck());
    </script>
</script>
</body>
</html>